package com.itheima.d05_singleton;

//懒汉式
public class SingleModel {

    //2.创建静态成员变量，保存对象引用
    /*
        volatile作用1：禁止指令重排序（内存屏障）
                    保证创建对象的原子性，避免多线程中获取不完整的对象
        volatile作用2：内存可见性
                    直接同步线程数据到主内存中，其他线程数据失效，需要同步新数据

     */
    private static   volatile  SingleModel singleModel;

    //1.构造方法私有化
    private SingleModel() {
    }

    //3.创建静态方法，返回对象引用
    //方案一：同步方法，效率低，后续每次操作都需要加锁/解锁
    /*public synchronized static SingleModel getInstance() {
        if (singleModel == null) {
            singleModel = new SingleModel();
        }
        return singleModel;
    }*/

    //方式二：同步代码块，效率较高，第一次并发访问时加锁/解锁
    //       DCL（double  check lock双检锁机制）
    public static SingleModel getInstance() {
        //外层if提高效率
        if(singleModel == null){
            //内层synchronized+if 保证单例
            synchronized (SingleModel.class) {
                if (singleModel == null) {
                    //java中创建对象的操作：不是原子性操作
                    singleModel = new SingleModel();
                    //1.分配内存空间
                    //3.设置对象引用指向内存地址
                    //2.初始化对象
                }
            }
        }
        return singleModel;
    }
}
























